/* Zatok - язык программирования текстовых игр
 * (С) 2010 - 2012 Меркулов Матвей Юрьевич
 * Код лицензирован под лицензией GNU LGPL
 * Вы можете прочитать текст лицензии по адресу:
 * http://www.gnu.org/copyleft/lesser.html
 * или прочитать русский перевод по адресу:
 * http://ru.wikisource.org/wiki/GNU_Lesser_General_Public_License
 */

package base.context;

import base.CObject;
import base.CProject;
import base.function.CFunction;
import base.userfunction.CFunctionCall;
import base.value.CValue;
import base.value.userobject.CUserObject;

public class CGetParameter extends CFunction {
	@Override
	public void Init() {
		AssertParam( 2 );
	}
	
	
	
	@Override
	public boolean ToBoolean() {
		return GetValue().ToBoolean();
	}



	@Override
	public int ToInt() {
		return GetValue().ToInt();
	}



	@Override
	public float ToFloat() {
		return GetValue().ToFloat();
	}



	@Override
	public String ToString() {
		return GetValue().ToString();
	}



	@Override
	public CUserObject ToObject() {
		return GetValue().ToObject();
	}



	@Override
	public void EquateTo( CObject Obj ) {
		CUserObject UserObject = Param[ 0 ].ToObject();
		CParameter Parameter = Param[ 1 ].ToParameter();
		if( Parameter == null ) Error( "Ожидается параметр объекта" );
		CValue Value = Obj.GetValue();
		if( Value != null ) UserObject.Parameters.put( Parameter, Value.Clone() );
	}

	
	
	@Override
	public void Execute() {
		CFunctionCall FunctionCall = Param[ 1 ].ToFunctionCall();
		if( FunctionCall == null ) Error( "Ожидается функция" );

		CUserObject OldCurrentObject = CProject.CurrentObject;
		CProject.CurrentObject = Param[ 0 ].ToObject();
		if( CProject.CurrentObject.BaseData.Functions.get( FunctionCall.FunctionID ) == null ) Error( "Функция объекта не найдена" );
		FunctionCall.Execute();
		CProject.CurrentObject = OldCurrentObject;
	}
	

	
	@Override
	public CValue GetValue() {
		CUserObject UserObject = Param[ 0 ].ToObject();
		CParameter Parameter = Param[ 1 ].ToParameter();
		if( Parameter == null ) {
			CFunctionCall FunctionCall = Param[ 1 ].ToFunctionCall();
			if( FunctionCall == null ) Error( "Ожидается функция или параметр объекта" );
			CUserObject OldCurrentObject = CProject.CurrentObject;
			CProject.CurrentObject = UserObject;
			FunctionCall.Execute();
			CProject.CurrentObject = OldCurrentObject;
			return FunctionCall.ReturnedValue;
		} else {
			CValue Value = Param[ 0 ].ToObject().Parameters.get( Parameter );
			if ( Value == null ) Error( "Параметр ''" + Parameter.Name + "'' не найден в объекте ''" + UserObject.toString() + "''" );
			return Value;
		}
	}
}
